# Makefile for UnZip(SFX) and fUnZip for Borland C++ 2.x-4.x and Turbo C++ 1.0
# Version: 5.53 and later        Alvin Koh, Jim Knoble, Christian Spieler, etc.
#
# Last revised:  29 Dec 05
#
# To compile with Turbo C++ 1.0, set the macro CC_REV to 1 at the command line
# (make -fmsdos/makefile.bc -DCC_REV=1).


#    GNU make doesn't like the return value from "rem"
#STRIP=rem
STRIP=echo  Ignore this line.
#    If you don't have UPX, LZEXE, or PKLITE, get one of them. Then define:
#    (NOTE: upx needs a 386 or higher system to run the exe compressor)
#STRIP=upx --8086 --best
#    or
#STRIP=lzexe
#    or
#STRIP=pklite
#    This makes a big difference in .exe size (and possibly load time).


#    Optional nonstandard preprocessor flags (as -DCHECK_EOF or -DDOS_WILD)
#    should be added to the environment via "set LOCAL_UNZIP=-DFOO" or added
#    to the declaration of LOC here:
LOC = $(LOCAL_UNZIP)

# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc.
CPU_TYP = 0

# (De)Select inclusion of optimized assembler CRC32 routine:
USE_ASMCRC = 1

!if $(CC_REV) == 1
# Turbo C++ 1.0
CC = tcc
!else
# Borland C++ 2.0, 3.0, 3.1 ...
! if !$(CC_REV)
CC_REV = 3
! endif
CC = bcc
!endif

AS = tasm

# "near data" model is sufficient for UnZip and ZipInfo, now that strings moved
# switched to medium model; UnZip code has grown beyond the 64k limit.
# since 5.42: switched to large model; medium model requires to much memory
# to compile zipinfo, reported for BC++ 4.51 and TC++ 1.0
# (compilation worked with 624k DOS memory and TC++ 1.0, but that much free
# space requires an almost "empty" DOS system)
# for 5.5: large or compact model required for Deflate64 support
UNMODEL = l		# large model for UnZip and ZipInfo
ASUNMODEL=__LARGE__	# keep in sync with UNMODEL definition !!

FUMODEL = c		# need compact model for fUnZip with Deflate64 support
ASFUMODEL=__COMPACT__	# keep in sync with FUMODEL definition !!

SXMODEL = s		# use small model for SFXUnZip (no Deflate64 support)
ASSXMODEL=__SMALL__	# keep in sync with SXMODEL definition !!

!if $(USE_ASMCRC)
ASMFLG = -DASM_CRC
ASMOBJS = crc_i86.obj
ASMOBJF = crc_i86_.obj
ASMOBJX = crc_i86x.obj
!else
ASMFLG =
ASMOBJS =
ASMOBJF =
ASMOBJX =
!endif


# compiler flags

ASCPUFLAG = __$(CPU_TYP)86
!if $(CPU_TYP) != 0
CC_CPUFLG = -$(CPU_TYP)
!endif
ASFLAGS = -ml -m2 -w0 -D$(ASCPUFLAG) $(LOC)
!if $(CC_REV) == 1
# Bug: TC ++ 1.0 ignores "far" on "const" strings, so const is disabled!
CCOPTIM = -O -G -Z -a -d -DZCONST
LDFLAGS = -lxncd		# for tcc
!else
CCOPTIM = -O2
LDFLAGS = -lxncd -l-P		# for bcc
!endif
CFLAGS  = $(CCOPTIM) $(CC_CPUFLG) -ff- -k- -P-.C -I. $(ASMFLG) $(LOC)
UNFLAGS = -m$(UNMODEL) $(CFLAGS)
FUFLAGS = -m$(FUMODEL) $(CFLAGS) -K -d
SXFLAGS = -m$(SXMODEL) $(CFLAGS)

# implicit rules

.asm.obj:
	$(AS) $(ASFLAGS) -D$(ASUNMODEL) $<

.c.obj:
	$(CC) -c $(UNFLAGS) {$< }

# list macros

OBJU1 = unzip.obj crc32.obj crypt.obj envargs.obj explode.obj
OBJU2 = extract.obj fileio.obj globals.obj inflate.obj list.obj match.obj
OBJU3 = process.obj ttyio.obj unreduce.obj unshrink.obj zipinfo.obj
OBJUS = msdos.obj $(ASMOBJS)
OBJU  = $(OBJU1) $(OBJU2) $(OBJU3) $(OBJUS)
OBJF  = funzip.obj crc32f.obj cryptf.obj globalsf.obj inflatef.obj \
	ttyiof.obj msdosf.obj $(ASMOBJF)
OBJX1 = unzipsfx.obj crc32x.obj cryptx.obj extractx.obj fileiox.obj
OBJX2 = globalsx.obj inflatex.obj matchx.obj processx.obj ttyiox.obj
OBJXS = msdosx.obj $(ASMOBJX)
OBJX  = $(OBJX1) $(OBJX2) $(OBJXS)

UNZIP_H = unzip.h unzpriv.h globals.h msdos/doscfg.h

# explicit rules

all:    unzip.exe funzip.exe unzipsfx.exe

unzip.exe:      $(OBJU)
	$(CC) -m$(UNMODEL) $(LDFLAGS) -eunzip.exe @&&|
$(OBJU)
|
	$(STRIP) unzip.exe

funzip.exe:     $(OBJF)
	$(CC) -m$(FUMODEL) $(LDFLAGS) -efunzip.exe @&&|
$(OBJF)
|
	$(STRIP) funzip.exe

unzipsfx.exe:   $(OBJX)
	$(CC) -m$(SXMODEL) $(LDFLAGS) -eunzipsfx.exe @&&|
$(OBJX)
|
	$(STRIP) unzipsfx.exe

clean:
	rem Ignore any errors in the following...
	-del *.obj
	-del unzip.exe
	-del funzip.exe
	-del unzipsfx.exe

# individual file dependencies

crc32.obj:      crc32.c $(UNZIP_H) zip.h crc32.h
crypt.obj:      crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h
envargs.obj:    envargs.c $(UNZIP_H)
explode.obj:    explode.c $(UNZIP_H)
extract.obj:    extract.c $(UNZIP_H) crc32.h crypt.h
fileio.obj:     fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h
globals.obj:    globals.c $(UNZIP_H)
inflate.obj:    inflate.c inflate.h $(UNZIP_H)
list.obj:       list.c $(UNZIP_H)
match.obj:      match.c $(UNZIP_H)
process.obj:    process.c $(UNZIP_H) crc32.h
ttyio.obj:      ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h
unreduce.obj:   unreduce.c $(UNZIP_H)
unshrink.obj:   unshrink.c $(UNZIP_H)
unzip.obj:      unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h
zipinfo.obj:    zipinfo.c $(UNZIP_H)

crc_i86.obj:    msdos/crc_i86.asm
	$(AS) $(ASFLAGS) -D$(ASUNMODEL) msdos\crc_i86.asm, $*.obj ;

crc_i86_.obj:   msdos/crc_i86.asm
	$(AS) $(ASFLAGS) -D$(ASFUMODEL) msdos\crc_i86.asm, $*.obj ;

crc_i86x.obj:   msdos/crc_i86.asm
	$(AS) $(ASFLAGS) -D$(ASSXMODEL) msdos\crc_i86.asm, $*.obj ;

msdos.obj:      msdos/msdos.c $(UNZIP_H)
	$(CC) -c $(UNFLAGS) msdos/msdos.c

funzip.obj:     funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h
	$(CC) -c $(FUFLAGS) funzip.c

crc32f.obj:     crc32.c $(UNZIP_H) zip.h crc32.h
	$(CC) -c $(FUFLAGS) -DFUNZIP -ocrc32f.obj crc32.c

cryptf.obj:     crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h
	$(CC) -c $(FUFLAGS) -DFUNZIP -ocryptf.obj crypt.c

globalsf.obj:   globals.c $(UNZIP_H)
	$(CC) -c $(FUFLAGS) -DFUNZIP -oglobalsf.obj globals.c

inflatef.obj:   inflate.c inflate.h $(UNZIP_H) crypt.h
	$(CC) -c $(FUFLAGS) -DFUNZIP -oinflatef.obj inflate.c

ttyiof.obj:     ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h
	$(CC) -c $(FUFLAGS) -DFUNZIP -ottyiof.obj ttyio.c

msdosf.obj:     msdos/msdos.c $(UNZIP_H)
	$(CC) -c $(FUFLAGS) -DFUNZIP -omsdosf.obj msdos/msdos.c

unzipsfx.obj:   unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h
	$(CC) -c $(SXFLAGS) -DSFX -ounzipsfx.obj unzip.c

crc32x.obj:     crc32.c $(UNZIP_H) zip.h crc32.h
	$(CC) -c $(SXFLAGS) -DSFX -ocrc32x.obj crc32.c

cryptx.obj:     crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h
	$(CC) -c $(SXFLAGS) -DSFX -ocryptx.obj crypt.c

extractx.obj:   extract.c $(UNZIP_H) crc32.h crypt.h
	$(CC) -c $(SXFLAGS) -DSFX -oextractx.obj extract.c

fileiox.obj:    fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h
	$(CC) -c $(SXFLAGS) -DSFX -ofileiox.obj fileio.c

globalsx.obj:   globals.c $(UNZIP_H)
	$(CC) -c $(SXFLAGS) -DSFX -oglobalsx.obj globals.c

inflatex.obj:   inflate.c inflate.h $(UNZIP_H)
	$(CC) -c $(SXFLAGS) -DSFX -oinflatex.obj inflate.c

matchx.obj:     match.c $(UNZIP_H)
	$(CC) -c $(SXFLAGS) -DSFX -omatchx.obj match.c

processx.obj:   process.c $(UNZIP_H) crc32.h
	$(CC) -c $(SXFLAGS) -DSFX -oprocessx.obj process.c

ttyiox.obj:     ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h
	$(CC) -c $(SXFLAGS) -DSFX -ottyiox.obj ttyio.c

msdosx.obj:     msdos/msdos.c $(UNZIP_H)
	$(CC) -c $(SXFLAGS) -DSFX -omsdosx.obj msdos/msdos.c
